package com.linkgie.galaxyframework.utils;

public class MathUtils {

	public static byte max(byte v1, byte v2) {
		return v1 > v2 ? v1 : v2;
	}

	/**
	 * 计算正整数乘方（幂）；
	 * 
	 * @param value 整数；
	 * @param x     大于等于 0 指数；
	 * @return
	 */
	public static long power(long value, int x) {
		if (x < 0) {
			throw new IllegalArgumentException("Negative exponent!");
		}
		if (x == 0) {
			return 1;
		}
		long r = value;
		for (int i = 1; i < x; i++) {
			r *= value;
		}
		return r;
	}

	/**
	 * 检查指定的两个值的差是否超出最大限制(大于 limit）；
	 * 
	 * @param value1 值1；
	 * @param value2 值2；
	 * @param limit  最大的差；不允许为负数；
	 * @return
	 */
	public static boolean isDifferenceOverrun(long value1, long value2, long limit) {
		assert limit >= 0 : "limit is negative!";
		if ((value1 ^ value2) < 0) {
			// 符号不同，避免直接相减导致溢出；
			if (value1 >= 0) {
				// value1 为正数或 0， value2 为负数；
				if (value1 > limit) {
					// overrun;
					return true;
				} else {
					limit = limit - value1;
					return value2 < -limit;
				}
			} else {
				// value2 为正数或 0， value1 为负数；
				if (value2 > limit) {
					// overrun;
					return true;
				} else {
					limit = limit - value2;
					return value1 < -limit;
				}
			}
		}

		// 符号相同；
		long diff = Math.abs(value1 - value2);
		return diff > limit;
	}

}
